/**
 * API配置文件
 * 包含基础URL、请求拦截器和响应拦截器
 */

// 环境化基础URL
// 开发环境：本地调试端口
const DEV_BASE_URL = 'http://localhost:8070';
// 生产环境：预留占位，可在发布前替换
const PROD_BASE_URL = 'https://api.studyapp.com';

const isDev = (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'development');
const BASE_URL = isDev ? DEV_BASE_URL : PROD_BASE_URL;

// 请求超时时间（毫秒）
const TIMEOUT = 60000;

// 创建请求实例
const request = (url, options = {}) => {
  // 从本地存储获取token
  const token = uni.getStorageSync('token') || '';
  
  // 构建完整的请求URL
  const fullUrl = url.startsWith('http') ? url : BASE_URL + url;
  
  // 设置默认请求头
  const headers = {
    'Content-Type': 'application/json',
    ...options.headers
  };
  
  // 如果有token，添加到请求头
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }
  
  // 处理 GET 查询参数与请求体
  const method = (options.method || 'GET').toUpperCase();
  // 兼容 options.params 与 options.data
  const params = options.params || {};
  const bodyData = options.data || {};
  const requestData = method === 'GET' ? (Object.keys(params).length ? params : bodyData) : bodyData;

  // 合并请求选项
  const requestOptions = {
    url: fullUrl,
    method,
    data: requestData,
    header: headers,
    timeout: TIMEOUT
  };
  
  // 返回Promise处理请求结果
  return new Promise((resolve, reject) => {
    uni.request({
      ...requestOptions,
      success: (res) => {
        // 处理响应结果
        const result = res.data;
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 统一按 { code, msg, data } 协议解析；若无 code 则直接返回
          if (result && typeof result === 'object' && Object.prototype.hasOwnProperty.call(result, 'code')) {
            const successCodes = [0, 200, '0', '200'];
            if (successCodes.includes(result.code)) {
              resolve(result);
            } else {
              uni.showToast({ title: result.msg || '请求失败', icon: 'none' });
              reject({ statusCode: res.statusCode, data: result });
            }
          } else {
            resolve(result);
          }
        } else {
          // 统一错误处理
          handleError(res);
          reject(res);
        }
      },
      fail: (err) => {
        // 网络错误处理
        uni.showToast({
          title: '网络请求失败，请检查网络连接',
          icon: 'none'
        });
        reject(err);
      },
      complete: () => {
        // 请求完成后的回调，可用于加载状态管理
        if (options.complete) {
          options.complete();
        }
      }
    });
  });
};

/**
 * 统一错误处理
 * @param {Object} res - 响应对象
 */
function handleError(res) {
  const statusCode = res.statusCode;
  const errorMessage = res.data?.message || '请求失败';
  
  switch (statusCode) {
    case 401:
      // 未授权，跳转到登录页面
      uni.removeStorageSync('token');
      uni.removeStorageSync('userInfo');
      uni.showToast({
        title: '登录已过期，请重新登录',
        icon: 'none'
      });
      setTimeout(() => {
        uni.reLaunch({
          url: '/pages/auth/login'
        });
      }, 1500);
      break;
    case 403:
      // 权限不足
      uni.showToast({
        title: '权限不足，无法访问',
        icon: 'none'
      });
      break;
    case 404:
      // 资源不存在
      uni.showToast({
        title: '请求的资源不存在',
        icon: 'none'
      });
      break;
    case 500:
      // 服务器错误
      uni.showToast({
        title: '服务器内部错误，请稍后再试',
        icon: 'none'
      });
      break;
    default:
      // 其他错误
      uni.showToast({
        title: errorMessage || `请求失败(${statusCode})`,
        icon: 'none'
      });
  }
}

export { request, BASE_URL };
export default request;